package top.lshaci.learning.jvm.ref;

import lombok.AllArgsConstructor;
import lombok.Data;

import java.lang.ref.SoftReference;

/**
 * SoftReferenceTest
 *
 * @author lshaci
 * @date 2020/8/7 16:50
 * @since 1.0.0
 */
public class SoftReferenceTest {

    @Data
    @AllArgsConstructor
    public static class User {
        public int id;
        public String name;
    }

    /**
     * -XX:+PrintGCDetails -Xms10m -Xmx10m
     */
    public static void main(String[] args) {
        // 创建对象， 建立软引用
        SoftReference<User> sr = new SoftReference<>(new User(1, "lshaci"));

        // 从软引用中重新获得强引用对象
        System.err.println(sr.get());

        System.gc();
        System.err.println("After GC:");

        /**
         * GC过后获得软引用中的对象
         * 堆空间内存充足, 不会回收
         */
        System.err.println(sr.get());

        try {
            // 让系统认为内存资源紧张
            byte[] b = new byte[7 * 1024 * 1024];
        } catch (Throwable e) {
            e.printStackTrace();
        } finally {
            /**
             * 再次从软引用中获取数据
             * 堆空间内存紧张，在OOM之前，垃圾回收器会回收该对象
             * null
             */
            System.err.println(sr.get());
        }

    }
}
